// 
// 
// 

#include "ElectricFan.h"

//
// 构造函数
// 参数：pwrKeyPin 电源按键，mdSwKeyPin模式切换按键
//
ElectricFan::ElectricFan(int pwrKeyPin, int mdSwKeyPin)
{
	powerState = false;
	mode = FAN_MODE_AUTO;
	powerKeyPin = pwrKeyPin;
	modeSwitchKeyPin = mdSwKeyPin;
}

//
// 端口设置初始化函数
//
void ElectricFan::Init(void)
{
	pinMode(powerKeyPin, OUTPUT);
	pinMode(modeSwitchKeyPin, OUTPUT);

	//
	// 继电器是低电平触发的
	//
	digitalWrite(powerKeyPin, HIGH);
	digitalWrite(modeSwitchKeyPin, HIGH);

#ifdef DEBUG
	DBGLN("Fan initializes done.");
	//DBGLN("Power key test.");
	//KeyPress(powerKeyPin);
	//delay(1000);
	//DBGLN("Mode key test.");
	//KeyPress(modeSwitchKeyPin);
#endif
	return;
}

//
// 开启风扇
//
void ElectricFan::PowerOn(void)
{
	if (!powerState)
	{
		KeyPress(powerKeyPin);
		powerState = true;
		mode = FAN_MODE_AUTO;

#ifdef DEBUG
		DBGLN("Power on.");
		DBGLN("MODE: AUTO.");
#endif
	}
}

//
// 关闭风扇
//
void ElectricFan::PowerOff(void)
{
	if (powerState)
	{
		KeyPress(powerKeyPin);
		powerState = false;
#ifdef DEBUG
		DBGLN("Power off.");
#endif
	}
}

//
// 模式设置
// mode可以使用的参数有：
// FAN_MODE_AUTO
// FAN_MODE_LEVEL_WEAK
// FAN_MODE_LEVEL_MEDIUM 
// FAN_MODE_LEVEL_STRONG
//
void ElectricFan::ModeSet(int fanMode)
{
	if (!powerState)
	{
#ifdef DEBUG
		DBGLN("Power off, cannot set mode.");
#endif
		return;
	}
	switch (fanMode)
	{
	case FAN_MODE_AUTO:
	{
		switch (mode)
		{
		case FAN_MODE_LEVEL_WEAK:
			//
			// 按键三次切换到自动模式
			//
			KeyPress(modeSwitchKeyPin);
			KeyPress(modeSwitchKeyPin);
			KeyPress(modeSwitchKeyPin);
			break;
		case FAN_MODE_LEVEL_MEDIUM:
			//
			// 按键两次到自动模式
			//
			KeyPress(modeSwitchKeyPin);
			KeyPress(modeSwitchKeyPin);
			break;
		case FAN_MODE_LEVEL_STRONG:
			//
			// 按键一次到自动模式
			//
			KeyPress(modeSwitchKeyPin);
			break;
		default:
			break;
		}
	}		
		mode = FAN_MODE_AUTO;
#ifdef DEBUG
		DBGLN("MODE: AUTO.");
#endif
		break;
	case FAN_MODE_LEVEL_WEAK:
	{
		switch (mode)
		{
		case FAN_MODE_AUTO:
			//
			// 按键一次即可
			//
			KeyPress(modeSwitchKeyPin);
			break;
		case FAN_MODE_LEVEL_MEDIUM:
			//
			// 按键三次即可
			//
			KeyPress(modeSwitchKeyPin);
			KeyPress(modeSwitchKeyPin);
			KeyPress(modeSwitchKeyPin);
			break;
		case FAN_MODE_LEVEL_STRONG:
			// 
			// 按键一次即可
			//
			KeyPress(modeSwitchKeyPin);
			break;
		default:
			break;
		}
	}
		mode = FAN_MODE_LEVEL_WEAK;
#ifdef DEBUG
		DBGLN("MODE: WEAK.");
#endif
		break;
	case FAN_MODE_LEVEL_MEDIUM:
	{
		switch (mode)
		{
		case FAN_MODE_AUTO:
			//
			// 按键两次
			// 
			KeyPress(modeSwitchKeyPin);
			KeyPress(modeSwitchKeyPin);
			break;
		case FAN_MODE_LEVEL_WEAK:
			//
			// 按键一次
			//
			KeyPress(modeSwitchKeyPin);
			break;
		case FAN_MODE_LEVEL_STRONG:
			//
			// 按键三次
			//
			KeyPress(modeSwitchKeyPin);
			KeyPress(modeSwitchKeyPin);
			KeyPress(modeSwitchKeyPin);
			break;
		default:
			break;
		}
	}
		mode = FAN_MODE_LEVEL_MEDIUM;
#ifdef DEBUG
		DBGLN("MODE: MEDIUM.");
#endif
		break;
	case FAN_MODE_LEVEL_STRONG:
	{
		switch (mode)
		{
		case FAN_MODE_AUTO:
			//
			// 按键三次
			//
			KeyPress(modeSwitchKeyPin);
			KeyPress(modeSwitchKeyPin);
			KeyPress(modeSwitchKeyPin);
			break;

		case FAN_MODE_LEVEL_WEAK:
			//
			// 按键两次
			//
			KeyPress(modeSwitchKeyPin);
			KeyPress(modeSwitchKeyPin);
			break;

		case FAN_MODE_LEVEL_MEDIUM:
			//
			// 按键一次
			//
			KeyPress(modeSwitchKeyPin);
			break;
		default:
			break;
		}
	}
		mode = FAN_MODE_LEVEL_STRONG;
#ifdef DEBUG
		DBGLN("MODE: STRONG.");
#endif
		break;
	default:
		break;
	}
}

//
// 获得当前的工作模式
// 返回的状态包括：
// FAN_MODE_AUTO
// FAN_MODE_LEVEL_WEAK
// FAN_MODE_LEVEL_MEDIUM 
// FAN_MODE_LEVEL_STRONG
// -1: 当电源没有打开
//
int ElectricFan::ModeGet(void)
{
	if (powerState)
	{
		return mode;
	}
	else
	{
		return -1;
	}
}

//
// 模拟按键按下一次
//
void ElectricFan::KeyPress(int keyPin)
{
	//
	// 按键按下，再弹起
	//
	digitalWrite(keyPin, LOW);
	delay(80);
	digitalWrite(keyPin, HIGH);
	delay(100);
	return;
}
